package smallfrench.moteur.biblio;

import java.awt.Color;
import java.util.HashMap;

import smallfrench.moteur.interp.RObjet;

/**
 * Représente une couleur RGB, équivalent de {@link java.awt.Color}.
 * @author antoine1023
 *
 */
public class RCouleur extends RObjet {

	public final Color valeur;

	private static final HashMap<String, Color> nomsCouleurs
	= new HashMap<String, Color>();

	static {
		nomsCouleurs.put("blanc", Color.WHITE);
		nomsCouleurs.put("bleu", Color.BLUE);
		nomsCouleurs.put("cyan", Color.CYAN);
		nomsCouleurs.put("gris", Color.GRAY);
		nomsCouleurs.put("jaune", Color.YELLOW);
		nomsCouleurs.put("magenta", Color.MAGENTA);
		nomsCouleurs.put("noir", Color.BLACK);
		nomsCouleurs.put("orange", Color.ORANGE);
		nomsCouleurs.put("rouge", Color.RED);
		nomsCouleurs.put("rose", Color.PINK);
		nomsCouleurs.put("vert", Color.GREEN);
	}

	public RCouleur(int rougeVertBleu) {
		super(RClasseCouleur.CLASSE);
		valeur = new Color(rougeVertBleu);
	}

	public RCouleur(int rouge, int vert, int bleu) {
		super(RClasseCouleur.CLASSE);
		valeur = new Color(rouge, vert, bleu);
	}

	public RCouleur(Color color) {
		super(RClasseCouleur.CLASSE);
		valeur = color;
	}

	public RCouleur() {
		this(Color.BLACK);
	}

	public RCouleur(String nom) {
		super(RClasseCouleur.CLASSE);

		Color c = nomsCouleurs.get(nom);
		if (c != null) {
			valeur = c;
		} else {
			valeur = Color.BLACK;
		}
	}

	@Override
	public boolean equals(Object objet) {
		if (objet instanceof RCouleur) {
			RCouleur c = (RCouleur)objet;
			return c.valeur.equals(valeur);
		}
		return false;
	}

	//------------------------------------------- Membres

	// TODO remplacer par une map
	@Override
	public RObjet getMembre(String nom) {
		try {
			return Membres.valueOf(nom).fonction;
		} catch (IllegalArgumentException e) {
			return super.getMembre(nom);
		}
	}

	//------------------------------------------- Strings

	@Override
	public RChaine enChaine() {
		return new RChaine(
				valeur.getRed() + " " +
						valeur.getGreen() + " " +
						valeur.getBlue()
				);
	}

	//------------------------------------------- Statics

	private static enum Membres {
		obtenirRouge(new RFonction () {
			@Override
			public RObjet appeler(RObjet oMoi, RObjet[] args) {
				RCouleur moi = (RCouleur)oMoi;
				return new REntier(moi.valeur.getRed());
			}
		}),
		obtenirVert(new RFonction () {
			@Override
			public RObjet appeler(RObjet oMoi, RObjet[] args) {
				RCouleur moi = (RCouleur)oMoi;
				return new REntier(moi.valeur.getGreen());
			}
		}),
		obtenirBleu(new RFonction () {
			@Override
			public RObjet appeler(RObjet oMoi, RObjet[] args) {
				RCouleur moi = (RCouleur)oMoi;
				return new REntier(moi.valeur.getBlue());
			}
		}),
		;

		private RFonction fonction;

		Membres(RFonction f) {
			fonction = f;
		}
	}

}
